#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <stdint.h>

#define MIN(a, b)	((a) < (b) ? (a) : (b))

#define IDX(i)		((i) >> 6)
#define B(i)		((i) & 0x3F)

#define GET_BIT(a, i)	(((a) >> (i)) & 1)
#define SET_BIT(a, i)	((a) |= (1 << (i)))
#define UNSET_BIT(a, i)	((a) &= ~(1 << (i)))

struct vector {
	int *data;
	size_t length;
	size_t length_max;
};

// {{{ vector mng
void
vector_init_(struct vector *v)
{
	v->data = (int *) calloc((size_t) 4, sizeof *v->data);
	v->length = 0UL;
	v->length_max = 4UL;
}

void
vector_add(struct vector *v, int a)
{
	if (v->length + 1UL > v->length_max)
		v->data = (int *) realloc(v->data,
				(sizeof *v->data) * (v->length_max *= 2));
	v->data[v->length++] = a;
}

void
vector_kill_(struct vector *v)
{
	free(v->data);
	v->length = v->length_max = 0UL;
}
// }}}

void
e_s_populate(struct vector *v, int n)
{
#define MAX_N	(MIN(843750, n))
	uint64_t *sieve;
	register unsigned long long i, j;

	sieve = (uint64_t *) calloc(MAX_N + 1UL, sizeof *sieve);

	for (i = 2; IDX(i) <= MAX_N; i++)
		if (!GET_BIT(sieve[IDX(i)], B(i))) {
			vector_add(v, (int) i);
			for (j = i * i; IDX(j) <= MAX_N; j += i)
				SET_BIT(sieve[IDX(j)], B(j));
		}

	free(sieve);
#undef MAX_N
}

int
main(int argc, char **argv)
{
	unsigned long long A, N;
	struct vector sieve, divisors;
	unsigned long long tmp = 0;
	int i;

	scanf("%d", &A);

	vector_init_(&sieve);
	e_s_populate(&sieve, A);

	vector_init_(&divisors);
	tmp = A;
	i = 0;
	while (tmp > 1 && i < sieve.length) {
		if (tmp % sieve.data[i] == 0) {
			vector_add(&divisors, sieve.data[i]);
			tmp /= sieve.data[i];
		}
		i++;
	}
	if (tmp == A || (tmp > 0 && tmp != 1))
		vector_add(&divisors, tmp);

	for (i = 0, N = 1; i < divisors.length; i++)
		N *= divisors.data[i];

	return 0;
}
